#导入相应的模块

import pygame
from pygame.locals import *
import time,random

class HeroPlan():
    '''玩家飞机(英雄)'''
    def __init__(self,screen_temp):
        self.x = 200 #定义飞机图片的左上角坐标在游戏窗口中的位置
        self.y = 450
        self.screen = screen_temp#获取屏幕窗口对象
        self.image = pygame.image.load('./image/me.png')#玩家图像
        self.bullet_list = []#用于存放玩家的子弹列表
        self.bomb_list = []
        self.__create_image()
        self.bBom = False
        self.image_num = 0
        self.image_index = 0

    def __create_image(self):
        self.bomb_list.append(pygame.image.load ('./image/bo0.png'))
        self.bomb_list.append(pygame.image.load ('./image/bo1.png'))
        self.bomb_list.append(pygame.image.load ('./image/bo2.png'))
        self.bomb_list.append(pygame.image.load ('./image/bo3.png'))

    def display(self):

        '''绘制玩家子弹'''
        for b in self.bullet_list:#先绘制子弹再绘制飞机，子弹的图片位于飞机的下侧
            b.display()
            if b.move():
                self.bullet_list.remove(b)#当子弹出屏幕后清空子弹夹，防止占用资源
                #print(len(self.bullet_list))

        if self.bBom:#如果玩家飞机爆炸，进入
            self.screen.blit(self.bomb_list[self.image_index], (self.x, self.y))
            self.image_num += 1 # 爆炸循环 +1
            if self.image_num == 3:#循环同一爆炸图片三次
                self.image_num = 0
                self.image_index += 1#循环下一张图片
            if self.image_index > 3:#如果所有图片放完
                time.sleep(1)
                exit()  # 调用exit让游戏退出
                # self.image_index = 0
        else:
            '''绘制玩家飞机'''
            self.screen.blit (self.image, (self.x, self.y))  # 根据窗口对象绘制飞机图片



    def move_left(self):
        '''左移动控制'''
        self.x-=15
        if self.x<=0:
            self.x=0

    def move_right(self):
        '''右移动控制'''
        self.x+=15
        if self.x>=406:
            self.x=406

    def fire(self):
        self.bullet_list.append(Bullet(self.screen,self.x,self.y))

        # bullet =  Bullet(self.screen,self.x,self.y)
        # self.bullet_list.append(bullet)

    def bomb(self, enemy):
        #遍历所有子弹
        for bo in enemy.bullet_list:
            if bo.x>self.x+5 and bo.x<self.x+100 and bo.y>self.y+20 and bo.y<self.y+70:
                enemy.bullet_list.remove(bo)#如果碰撞消除子弹
                self.bBom = True
                return True
        return False

class Bullet:
    '''子弹类'''
    def __init__(self,screen_temp,x,y):
        self.x=x+53 #定义子弹在飞机中间的位置
        self.y=y
        self.screen=screen_temp#获取屏幕窗口对象
        self.image=pygame.image.load('./image/pd.png')#玩家图像

    def display(self):
        '''绘制子弹'''
        self.screen.blit(self.image,(self.x,self.y))#根据窗口对象绘制飞机图片

    def move(self):
        '''子弹移动'''
        self.y-=20
        if self.y<=-20:
            return True

class EnemyBullet:
    '''敌机子弹类'''
    def __init__(self,screen_temp,x,y):
        self.x=x+49.5 #定义子弹在飞机中间的位置
        self.y=y+74
        self.screen=screen_temp#获取屏幕窗口对象
        self.image=pygame.image.load('./image/pd3.png')#玩家图像

    def display(self):
        '''绘制子弹'''
        self.screen.blit(self.image,(self.x,self.y))#根据窗口对象绘制子弹图片

    def move(self):
        '''子弹移动'''
        self.y+=10
        if self.y>=568:
            return True

class EnemyPlane:
    '''敌机类'''
    def __init__(self,screen_temp):
        self.x = random.choice(range(408)) # 定义敌机的随机位置x方向上0-407
        self.y = -75
        self.screen = screen_temp#获取屏幕窗口对象
        self.image = pygame.image.load('./image/e2.png')# 绘制敌机图像
        self.bullet_list = [] # 用于存放敌机的子弹列表
        self.bullet_flag = False
        self.bomb_list = []
        self.__create_image()
        self.image_num = 0
        self.image_index = 0
        self.bHit = False

    def __create_image(self):
        self.bomb_list.append(pygame.image.load ('./image/bo0.png'))
        self.bomb_list.append(pygame.image.load ('./image/bo1.png'))
        self.bomb_list.append(pygame.image.load ('./image/bo2.png'))
        self.bomb_list.append(pygame.image.load ('./image/bo3.png'))

    def display(self):

        if self.bHit:  # 如果玩家飞机爆炸，进入
            self.screen.blit(self.bomb_list[self.image_index], (self.x, self.y))
            self.image_num += 1  # 爆炸循环 +1
            if self.image_num == 3:
                self.image_num = 2
                self.image_index += 1
        else:
            '''绘制敌机'''
            self.screen.blit (self.image, (self.x, self.y))  # 根据窗口对象绘制飞机图片
        '''绘制敌机子弹'''
        for b in self.bullet_list:#先绘制子弹再绘制飞机，子弹的图片位于飞机的下侧
            b.display()
            if b.move():
                self.bullet_list.remove(b)#当子弹出屏幕后清空子弹夹，防止占用资源


    def move(self,hero):
        '''敌机移动'''
        self.y+=4
        if self.y>568:#敌机出屏幕了
            return True
        for bo in hero.bullet_list:
            if bo.x>self.x+5 and bo.x<self.x+100 and bo.y>self.y+20 and bo.y<self.y+70:
                hero.bullet_list.remove(bo)#如果碰撞消除子弹
                return True

    def fire(self):
        #if random.choice(range(15))==5:#随机发子弹
            #self.bullet_list.append(EnemyBullet(self.screen,self.x,self.y))
        if not self.bullet_flag : #敌机只发一发子弹
            self.bullet_list.append(EnemyBullet(self.screen,self.x,self.y))
        self.bullet_flag=True

    def bomb(self):
        self.bHit = True

def key_control(hero_temp):
    '''键盘控制函数'''
    #执行退出操作
    for event in pygame.event.get():
        if event.type==QUIT:
            print('exit()')
            exit()
    #获取按键信息
    pressed_keys=pygame.key.get_pressed()
    #做判断并执行对像的操作
    if pressed_keys[K_LEFT] or pressed_keys[K_a]:
        print('left')
        hero_temp.move_left()
    elif pressed_keys[K_RIGHT] or pressed_keys[K_d]:
        print('right')
        print(str(hero_temp.x))
        hero_temp.move_right()
    if pressed_keys[K_SPACE]:
        print('space')
        hero_temp.fire()

#定义主函数
def main():
    '''主程序函数'''
    #设置游戏主界面,创建游戏窗口
    screen=pygame.display.set_mode((512,568),0,0)
    #创建游戏背景
    background=pygame.image.load('./image/bg2.jpg')
    #创建玩家飞机
    hero=HeroPlan(screen)
    roll=-968 #滚动初始值
    enemylist=[]#存放敌机的列表
    while True:#画面无缝滚动的效果
        #绘制画面
        screen.blit(background,(0,roll))#纵坐标是用图片的长度减去窗口的长度
        roll+=2
        if roll>=-200:#当画面走到一半的时候，即768，则重新绘制画面
            roll=-968
        #绘制玩家飞机
        hero.display()
        #执行键盘控制
        key_control(hero)
        #随机绘制敌机
        if random.choice(range(50))==10:
            enemylist.append(EnemyPlane(screen))

        #遍历敌机并绘制移动
        for em in enemylist:
            em.display()
            em.fire()
            if em.move(hero):
                em.bomb()
            hero.bomb(em)
            if em.image_index == 3:
                enemylist.remove(em)  # 如果碰撞消除敌机
        #更新显示
        pygame.display.update()
        #定时显示
        time.sleep(0.04)#每0.04秒换一次，即1秒换25帧

#调用主程序,判断当前是否是主运行程序，并调用
if __name__=='__main__':
    main()
